<?php
	require_once(dirname(__FILE__)."/config/include.php");
			
	$time = date("Ymd H:i:s") ;
	
	$_PARA 	= array() ;
	if(array_key_exists('return_code',$_POST))	$_PARA 		= $_POST ;
	else										$_PARA 		= $_GET ;
	ob_start();
	
	$msg = "" ;
	if (array_key_exists('return_code', $_PARA) == false){
		if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])){
		    $xmls = file_get_contents('php://input');
		}else{
			$xmls = $GLOBALS['HTTP_RAW_POST_DATA'] ;
		}
		if (is_null($xmls) || $xmls == ""){
			$xmls = $_POST['json'] ;
		}
		
		if (is_null($xmls)){			
			err_return("没有取到返回数据.") ;		
		}
		$pos = strpos($xmls, 'xml');
	    if (!$pos){
	    	file_put_contents(dirname(__FILE__)."/log_pay_wx.txt","$time -- $xmls.\r\n",FILE_APPEND);	    	
	    	err_return("返回数据非XML.") ;
	    }
	    
	    $msg = "" ;
	    $obj = simplexml_load_string($xmls) ;
	    if(is_object($obj)){
			$obj = get_object_vars($obj);
			foreach($obj as $k=>$tmp){ 
				$_PARA[$k] = strval($tmp) ;
				$msg .= "$k = ".$_PARA[$k]."\r\n" ; 
			}
			file_put_contents(dirname(__FILE__)."/log_pay_wx.txt","$time -- $msg.\r\n",FILE_APPEND);
	    }else{
	    	err_return("XML 解析错误") ;
	    }
	}else{
		$msg = "" ;
		foreach ($_PARA as $k=>$tmp){
			$msg .= "$k = ".$_PARA[$k]."\r\n" ; 
		}
		file_put_contents(dirname(__FILE__)."/log_pay_wx.txt","$time -- $msg.\r\n",FILE_APPEND);
	}
	
	$return_code     = trim($_PARA['return_code']);

	message_log_wx("微信订单回调返回  : $return_code") ;

		
	if ($return_code != "SUCCESS"){
		err_return(trim($_PARA['return_msg'])) ;
	}
	$result_code	= trim($_PARA['result_code']);
	if ($result_code != "SUCCESS"){
		err_return("(".trim($_PARA['err_code']).")".trim($_PARA['err_code_des'])) ;
	}
	
	sql_connect() ;
	
	$out_trade_no  	= trim($_PARA['out_trade_no']);		// 商户订单号	
	$transaction_id = trim($_PARA['transaction_id']);	// 微信支付订单号
	
	$is_create_logistics = true ;	// 是否处理物流表
	$out_trade_no_count = 0 ;		// 支付次数
	
	// 检测是否多次支付的订单号
	$trarr = explode("_" , $out_trade_no);
	if (is_array($trarr) && count($trarr) >= 2){
		$out_trade_no = $trarr[0] ;
		$out_trade_no_count = $trarr[1] ;
	}
	
	// 判定订单是否正确
	$log_pay = sql_fetch_one("select * from log_pay where `trade_no` = '$out_trade_no' and `trade_no_count` = '$out_trade_no_count' ") ;
	if (!is_array($log_pay) || !array_key_exists("trade_no", $log_pay)){
		err_return("订单不存在") ;
	}
	if ($out_trade_no != $log_pay['trade_no'])
	{
		err_return("订单号不正确") ;
	}
	
	// 多次支付只有第一次创建物流表
	if ($out_trade_no_count > 1){
		$is_create_logistics = false ;
	}
	
	// 支付表的 唯一ID
	$prepay_id = $log_pay['prepay_id'] ;
		
	// 验证订单合法性	
	$total_fee = intval($_PARA['total_fee']) ;			// 订单总金额，单位为分
	$cash_fee =  intval($_PARA['cash_fee']) ;			// 现金支付金额
	$openid = trim($_PARA['openid']);					// 用户标识
	$r_data = "微信订单号:$transaction_id , 总金额:$total_fee 分 , 现金支付金额:$cash_fee 分, 支付用户标识:$openid" ;
	$_PARA['MemoText'] = $r_data ;
	$newmemo = json_encode($_PARA,JSON_UNESCAPED_UNICODE);	// json_encode($_PARA) ;

	sql_query("update log_pay set `state` = '1' , `transaction_id` = '$transaction_id' , `memo_xml` = '$newmemo' where `prepay_id` = '$prepay_id' and `state` = 0") ;
	$log_pay = sql_fetch_one("select * from log_pay where `prepay_id` = '$prepay_id' and `state` = 1") ;
	if (!is_array($log_pay) || !array_key_exists("trade_no", $log_pay)){
		err_return("订单已处理") ;
	}
	
	// 根据订单情况生成物流表数据.
	if ($is_create_logistics == true){
		// 多次支付只有第一次创建物流表
		create_logistics_for_trade($out_trade_no) ;
	}
	sql_query("update log_pay set `state` = '2' , `state_count` = `state_count` + 1 , `endtime` = unix_timestamp() where `prepay_id` = '$prepay_id'") ;
	

	$price_now = 0 ;		// 已经支付的金额
	$trade_count = 0 ;		// 已经支付的次数
	$alltrade = sql_fetch_rows("select * from `log_pay` where `trade_no` = '$out_trade_no' and `state` in (1 , 2)") ;
	if (is_array($alltrade)){
		foreach($alltrade as $at)
		{
			$price_now += doubleval($at['rmb']) ;
			$trade_count += 1 ;
		}
	}
	
	$uid = $log_pay['uid'] ;
	$one_trade = sql_fetch_one("select * from pay_trade where `trade_no` = '$out_trade_no' and `user_id` = '$uid'") ;
	$price_modify = doubleval($one_trade['price_modify']) ;
	
	
	if ($price_modify != $price_now){
		// 已经支付的和总支付的不相等 -- 多次支付,首次支付,修改支付状态为支付部分 , 订单状态为支付状态.
		if ($out_trade_no_count <= 1){
			sql_query("update `pay_trade` set `price_state` = 11 , `trade_state` = 1 where `trade_no` = '$out_trade_no'") ;
		}
	}else{
		// 已经支付 = 总支付, 支付完成
		sql_query("update `pay_trade` set `price_state` = 1 where `trade_no` = '$out_trade_no'") ;		
		sql_query("update `pay_trade` set `trade_state` = 1 where `trade_no` = '$out_trade_no' and `trade_state` = 0") ;
	}
	send_user_pay_money_SMS($out_trade_no , $uid , $total_fee / 100) ;
	
	
	ok_return() ;

	function message_log_wx($message)
	{
		$time = date("Ymd H:i:s") ;
		file_put_contents(dirname(__FILE__)."/log_pay_wx.txt","---------$time ----- $message.\r\n\r\n",FILE_APPEND);
	}
	function err_return($err_message)
	{
		ob_end_clean();
		$show = "<xml>
  					<return_code><![CDATA[FAIL]]></return_code>
  					<return_msg><![CDATA[$err_message]]></return_msg>
				</xml>" ;
	    echo $show ;
		ob_end_flush();
		$time = date("Ymd H:i:s") ;
		file_put_contents(dirname(__FILE__)."/log_pay_wx.txt","$time -- $show.\r\n",FILE_APPEND);
		exit(0) ;
	}
	function ok_return()
	{
		ob_end_clean();
		$show = "<xml>
  					<return_code><![CDATA[SUCCESS]]></return_code>
  					<return_msg><![CDATA[OK]]></return_msg>
				</xml>" ;
	    echo $show ;
		ob_end_flush();
		$time = date("Ymd H:i:s") ;
		file_put_contents(dirname(__FILE__)."/log_pay_wx.txt","$time -- $show.\r\n",FILE_APPEND);
		exit(0) ;
	}
	
?>